package cn.tedu.submarine;
import javax.swing.ImageIcon;
import java.util.Random;
import java.awt.Graphics;

/** 海洋对象*/
public abstract class SeaObject {
    public static final int LIVE = 0; //活着的
    public static final int DEAD = 1; //死了的
    protected int state = LIVE; //当前状态(默认为活着的)

    protected int width; //宽
    protected int height; //高
    protected int x;       //x坐标
    protected int y;      //y坐标
    protected int speed;  //移动速度

    /** 专门给侦查潜艇，鱼雷潜艇，水雷潜艇用的*/
    public SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width;//负的潜艇的宽
        Random rand = new Random();
        //479窗体高度，height,侦查潜艇的高，150海平面到窗体头部的高
        y = rand.nextInt(World.HEIGHT-height-150+1)+150; //150到460之间
        speed = rand.nextInt(3)+1; //1到3之间的
    }
    /** 专门给战舰、鱼雷、水雷、深水炸弹提供的*/
    public SeaObject(int width,int height,int x,int y,int speed){
            this.width = width;
            this.height = height;
            this.x = x;
            this.y = y;
            this.speed = speed;
    }
    //只要派生类要执行的业务功能不一样时设计成抽象方法
    //抽象方法的意义：1.向上造型时，等通过超类引用点出方法，提供入口
    //              2.强制派生类必须重写
    public abstract void step();

    //因为派生类都有一个共同获取图片的行为，又因为获取到的图片不一样，也就是执行的行为是不一样的
    //所以设计为抽象方法子类卡卡重写就可以了，重写方法被调用时看的是对象的类型。
    public abstract ImageIcon getImage();

    //每个对象都需要判断状态所有是共有的行为，而且都是一样的
    /** 判断是否是活着的*/
    public boolean isLive(){
        return state == LIVE; //若当前状态为LIVE,表示为活着的，则返回true,否则返回false
    }
    public boolean isDead(){
        return state == DEAD; //若当前状态为DEAD,表示为死了的，则返回true,则返回false.
    }

    public void paintImage(Graphics g){
        if (isLive()){ //若活着的
            this.getImage().paintIcon(null,g,this.x,this.y); //画图片
        }
    }

    /** 生成雷(鱼雷、水雷)对象 */
    public SeaObject shootThunder(){
        int x = this.x+this.width;
        int y = this.y-5;
        if (this instanceof TorpedoSubmarine){ //若对象为鱼雷潜艇
            return new Torpedo(x,y);
        }else if (this instanceof MineSubmarine){ //若对象为水雷潜艇
            return new Mine(x,y);
        }else{ //若对象为侦查潜艇
            return null; //不生成雷
        }
    }

    /** 检测潜艇越界*/
    public boolean isOutOfBounds(){
        return x >= World.WIDTH; //潜艇的x>=窗口的宽，即为潜艇越界
    }

    /** 检测碰撞 */
    public boolean isHit(SeaObject other){
        int x1 = this.x-other.width;
        int x2 = this.x+this.width;
        int y1 = this.y-other.height;
        int y2 = this.y+this.height;
        int x = other.x;
        int y = other.y;
        return x>=x1 && x<=x2 && y>=y1 && y<=y2;
    }

    /** 海洋对象去死*/
    public void goDead(){
        state = DEAD; //将对象状态修改为DEAD死了的
    }
}
